// 正则表达式参考
// https://juejin.cn/post/6844903569569611783

// replace(regexp|substr, newstr|function), trim删除字符头尾的空格
// 该函数的返回值(obj[key]=jawil)将替换掉第一个参数(match=={{name}})匹配到的结果。

String.prototype.render = function (context) {
  return this.replace(/{{(.*?)}}/g, (match, key) => context[key.trim()]);
};

const str = "{{name}}很厉name害，才{{ age  }}岁".render({
  name: "jawil",
  age: "15",
});

console.log("str", str);

const context = { name: "jawil", age: "15" };
"{{name}}很厉name害，才{{ age  }}岁".replace(/{{(.*?)}}/g, (match, key) => {
  console.log(match, "match", "key", key);
  context[key.trim()];
});

// -----------------------------------

String.prototype.renderTwo = function (context) {
  return this.replace(/\${(.*?)}/g, (match, key) => context[key.trim()]);
};

const context2 = { name: "jawil", age: "15" };
"${name}很厉name害，才${ age  }岁".replace(/\${(.*?)}/g, (match, key) => {
  console.log(match, "match", "key", key);
  context2[key.trim()];
});

const str2 = "${name}很厉name害，才${ age  }岁".renderTwo({
  name: "jawil",
  age: "15",
});

console.log("str2", str2);

// ---------------------存在问题，就是模板中不能有空格
function render(template, data) {
  // const reg = /\{\{(\w+)\}\}/;    这种方式，在模板中出现空格就会有问题
  const reg = /\{\{(.*?)\}\}/;
  if (reg.test(template)) {
    console.log("reg.test(template)", reg.test(template));
    // const name = reg.exec(template)[1];这种方式，在模板中出现空格就会有问题
    const name = reg.exec(template)[1].trim();
    console.log("reg.exec(template)", reg.exec(template));
    template = template.replace(reg, data[name]);
    return render(template, data);
  }
  return template;
}

let template = "我是{{name}}，职业{{job }}，工资{{ salary }}";
let person = { name: "阿巴", job: "前端", salary: 30000 };
console.log(render(template, person)); // 我是阿巴，职业前端，工资30000

var isValid = function (s) {
  if (s.length % 2 === 1) return false;
  // 初始化一个map结构
  let map = new Map([
    ["(", ")"],
    ["[", "]"],
    ["{", "}"],
  ]);
  // 初始化一个栈用来存放 左括号
  let stack = [];
  for (let current of s) {
    if (map.has(current)) {
      // 左括号 入栈
      stack.push(current);
    } else {
      // 当前右括号 与栈顶元素匹配
      if (current === map.get(stack[stack.length - 1])) {
        stack.pop();
      } else {
        return false;
      }
    }
  }
  // 长度为0返回true,栈内还有内容就返回false
  return !stack.length;
};
